using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data;
namespace CapaAccesoDatos.Clases
{
    public class HorarioCAD
    {
        //-------------------------------------------------------------------------------//
        // Propiedades de la Clase.                                                      //
        //-------------------------------------------------------------------------------//
        private int id;
        private DateTime horaInicio;
        private DateTime horaFin;

        //-------------------------------------------------------------------------------//
        // Accesores publicos de la Clase.                                               //
        //-------------------------------------------------------------------------------//
        public int Id
        {
            get { return this.id; }
        }
        public DateTime HoraInicio
        {
            get { return this.horaInicio; }
        }
        public DateTime HoraFin
        {
            get { return this.horaFin; }
        }

        //-------------------------------------------------------------------------------//
        // Constructores de la Clase.                                                    //
        //-------------------------------------------------------------------------------//
        internal HorarioCAD(int Id, DateTime HoraInicio, DateTime HoraFin)
        {
            this.id = Id;
            this.horaInicio = HoraInicio;
            this.horaFin = HoraFin;
        }

        internal HorarioCAD(DataRow Row)
        {
            this.id = Convert.ToInt32(Row[Constantes.Tablas.Horarios.Campo_Id]);
            this.horaInicio = Convert.ToDateTime(Row[Constantes.Tablas.Horarios.Campo_Hora_Inicio]);
            this.horaFin = Convert.ToDateTime(Row[Constantes.Tablas.Horarios.Campo_Hora_Fin]);
        }

        public HorarioCAD(DateTime HoraInicio, DateTime HoraFin)
        {
            this.id = BuscarPorDate(HoraInicio, HoraFin);
            this.horaInicio = HoraInicio;
            this.horaFin = HoraFin;
        }

        //-------------------------------------------------------------------------------//
        //Metodos de la interface(despreciada a favor de metodos estaticos)              //
        //-------------------------------------------------------------------------------//
        private static void Save(HorarioCAD HorarioToSave)
        {
            String SqlCommand = "INSERT INTO " + Constantes.Tablas.Horarios.Nombre + "(" + 
                                Constantes.Tablas.Horarios.Campo_Hora_Inicio + ", " +  
                                Constantes.Tablas.Horarios.Campo_Hora_Fin + ") VALUES ('" +
                                HorarioToSave.HoraInicio.ToString() + "', '" + 
                                HorarioToSave.HoraFin.ToString() + "')";
            //Sentencia:
            /*INSERT INTO Horarios (Hora_Inicio, Hora_Fin) 
             * Values('ValoresRecibidos')
             */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: HorariosCAD.Save(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
            
        }
        public static void Update(HorarioCAD HorarioToUpdate)
        {
            String SqlCommand = "UPDATE " + Constantes.Tablas.Horarios.Nombre + " SET " +  
                                Constantes.Tablas.Horarios.Campo_Hora_Inicio + "='" + HorarioToUpdate.HoraInicio.ToShortDateString() + "'=" +
                                Constantes.Tablas.Horarios.Campo_Hora_Fin + "='" + HorarioToUpdate.HoraFin.ToShortDateString() + "'" + 
                                " WHERE " + Constantes.Tablas.Horarios.Campo_Id + " = " + HorarioToUpdate.Id.ToString();
            //Sentencia:
            /* UPDATE Tabla Horarios set HoraInicio, HoraFin 
             * WHERE Id (de la tabla) = Id; 
             */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: HorariosCAD.Update(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }
        public static void Delete(HorarioCAD HorarioToDelete)
        {
            String SqlCommand = "DELETE FROM " + Constantes.Tablas.Horarios.Nombre +
                                " WHERE " + Constantes.Tablas.Horarios.Campo_Id + 
                                " = " + HorarioToDelete.Id.ToString();
            //Sentencia:
            /*DELETE FROM Horarios where id = 'IdRecibido'*/

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: HorariosCAD.Delete(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }

        //-------------------------------------------------------------------------------//
        // Estos son los metodos especiales para el uso de la Capa de Lenguaje de Negocios
        //-------------------------------------------------------------------------------// 
        public static HorarioCAD BuscarPorId(int Id)
        {
            HorarioCAD Retorno = null;
            String SqlCommand = " SELECT * FROM " + Constantes.Tablas.Horarios.Nombre +
                                " WHERE " + Constantes.Tablas.Horarios.Campo_Id +
                                " = " + Id.ToString();

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlDataReader Cursor = null;
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Cursor = Comando.ExecuteReader(CommandBehavior.SingleRow);

                while (Cursor.Read())
                {
                    Retorno = new HorarioCAD(Convert.ToInt32(Cursor[Constantes.Tablas.Horarios.Campo_Id]),
                                             Convert.ToDateTime(Cursor[Constantes.Tablas.Horarios.Campo_Hora_Fin]),
                                             Convert.ToDateTime(Cursor[Constantes.Tablas.Horarios.Campo_Hora_Inicio]));
                }
                Cursor.Close();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: HorariosCAD.BuscarPorId(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return Retorno;
        }

        public static List<HorarioCAD> BuscarHorarioEnLista(List<int> Elementos)
        {
            List<HorarioCAD> Lista = new List<HorarioCAD>();
            DataSet Resultado = new DataSet();
            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlDataAdapter Adaptador = new SqlDataAdapter();
            SqlCommand ComandoSql = new SqlCommand("SELECT * FROM " + Constantes.Tablas.Horarios.Nombre +
                                                   " WHERE " + Constantes.Tablas.Horarios.Campo_Id +
                                                   " IN (", Conexion);
            //La sentencia es
            /*
             * SELECT * FROM Tabla WHERE Id IN :P1
             * Donde :P1 es el numero del Id! */

            SqlTransaction Tx = null;

            for (int i = 0; i < Elementos.Count; i++)
            {
                if (i == 0)
                    ComandoSql.CommandText += Elementos[i].ToString();
                else
                    ComandoSql.CommandText += "," + Elementos[i].ToString();
            }
            ComandoSql.CommandText += ")";

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();

                Adaptador.SelectCommand = ComandoSql;
                Adaptador.SelectCommand.Transaction = Tx;
                Adaptador.Fill(Resultado, Constantes.Tablas.Horarios.Nombre);
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: HorariosCAD.BuscarHorariosEnLista(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                ComandoSql.Dispose();
                Conexion.Dispose();
                Adaptador.Dispose();
            }

            foreach (DataRow Row in Resultado.Tables[Constantes.Tablas.Horarios.Nombre].Rows)
            {
                Lista.Add(new HorarioCAD(Row));
            }
            return Lista;
        }

        internal static int BuscarPorDate(DateTime HoraInicio, DateTime HoraFin)
        {
            int Retorno = 0;
            String SqlCommand = " SELECT " + '*' + 
                                " FROM " + Constantes.Tablas.Horarios.Nombre +
                                " WHERE " + Constantes.Tablas.Horarios.Campo_Hora_Inicio +
                                " = '" + HoraInicio.ToString() + "' AND " +
                                Constantes.Tablas.Horarios.Campo_Hora_Fin +
                                " = '" + HoraFin.ToString() +"'";

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlDataReader Cursor = null;
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Cursor = Comando.ExecuteReader();

                while (Cursor.Read())
                {
                    Retorno = Convert.ToInt32(Cursor[Constantes.Tablas.Horarios.Campo_Id]);
                }

                Cursor.Close();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: HorariosCAD.BuscarPorId(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return Retorno;
        }

        public static int SaveHorarioCADAndReturnId(HorarioCAD Horario)
        {
            HorarioCAD.Save(Horario);
            return HorarioCAD.BuscarPorDate(Horario.HoraInicio, Horario.HoraFin);
        }
    }
}

